package com.demo.tx.seata.service.tcc;

import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.rm.tcc.api.LocalTCC;
import io.seata.rm.tcc.api.TwoPhaseBusinessAction;

/**
 * 本地使用TCC模式，需要在接口添加LocalTCC注解
 * 如果不添加TCC注解，会走AT模式
 */
@LocalTCC
public interface SeataTCCService {

    /**
     * TwoPhaseBusinessAction注解useTCCFence=true，解决TCC事务幂等，悬挂和空回滚问题，默认为false。
     * 必须新建表tcc_fence_log，记录事务状态。
     * useTCCFence=true，异常时prepare对数据库操作都会回滚，相当于方法开启了事务
     *
     * @param actionContext seata上下文
     * @param userId 用户id
     * @param sleepTime 睡眠时间
     * @throws InterruptedException 线程中断异常
     */
    @TwoPhaseBusinessAction(name = "createUser", commitMethod = "commitMethod", rollbackMethod = "rollbackMethod", useTCCFence = true)
    void prepare(BusinessActionContext actionContext, Long userId, Long  sleepTime) throws InterruptedException;

    boolean commitMethod(BusinessActionContext actionContext);

    boolean rollbackMethod(BusinessActionContext parameterContext);
}
